# 版本: 0.5.0.20240803
# 作者: 陈振玺
# 功能: 分析CSV/TSV文件中指定列的基本统计信息

import pandas as pd
import argparse
import sys
from pathlib import Path

def analyze_column_stats(file_path, column_name, delimiter=None):
    """
    分析CSV/TSV文件中指定列的基本统计信息
    
    Args:
        file_path (str): 文件路径
        column_name (str): 要分析的列名
        delimiter (str): 分隔符，None时自动检测
    
    Returns:
        dict: 统计结果
    
    版本: 1.0.0.20250120
    作者: 陈振玺
    """
    try:
        # 自动检测分隔符
        if delimiter is None:
            if file_path.lower().endswith('.tsv'):
                delimiter = '\t'
            elif file_path.lower().endswith('.csv'):
                delimiter = ','
            else:
                # 尝试自动检测
                with open(file_path, 'r', encoding='utf-8') as f:
                    first_line = f.readline()
                    if '\t' in first_line:
                        delimiter = '\t'
                    else:
                        delimiter = ','
        
        # 读取数据
        df = pd.read_csv(file_path, delimiter=delimiter)
        
        # 检查列是否存在
        if column_name not in df.columns:
            available_columns = ', '.join(df.columns.tolist())
            raise ValueError(f"列 '{column_name}' 不存在。可用列: {available_columns}")
        
        # 获取指定列
        column_data = df[column_name]
        
        # 基本统计信息
        stats = {
            '总行数': len(column_data),
            '非空值数量': column_data.count(),
            '空值数量': column_data.isnull().sum(),
            '唯一值数量': column_data.nunique()
        }
        
        # 数据类型判断和相应统计
        if pd.api.types.is_numeric_dtype(column_data):
            # 数值型数据统计
            numeric_stats = {
                '数据类型': '数值型',
                '最小值': column_data.min(),
                '最大值': column_data.max(),
                '平均值': round(column_data.mean(), 4),
                '中位数': column_data.median(),
                '标准差': round(column_data.std(), 4),
                '25%分位数': column_data.quantile(0.25),
                '75%分位数': column_data.quantile(0.75)
            }
            stats.update(numeric_stats)
        else:
            # 文本型数据统计
            text_stats = {
                '数据类型': '文本型',
                '最常见值': column_data.mode().iloc[0] if not column_data.mode().empty else 'N/A',
                '最常见值频次': column_data.value_counts().iloc[0] if len(column_data.value_counts()) > 0 else 0
            }
            stats.update(text_stats)
            
            # 字符串长度统计（如果是字符串）
            if column_data.dtype == 'object':
                str_lengths = column_data.astype(str).str.len()
                length_stats = {
                    '平均字符长度': round(str_lengths.mean(), 2),
                    '最短字符长度': str_lengths.min(),
                    '最长字符长度': str_lengths.max()
                }
                stats.update(length_stats)
        
        # 频次统计（显示前10个最常见的值）
        value_counts = column_data.value_counts().head(10)
        stats['前10个最常见值'] = value_counts.to_dict()
        
        return stats
        
    except FileNotFoundError:
        raise FileNotFoundError(f"文件不存在: {file_path}")
    except pd.errors.EmptyDataError:
        raise ValueError("文件为空或格式不正确")
    except Exception as e:
        raise Exception(f"分析过程中出现错误: {str(e)}")

def print_stats(stats):
    """
    格式化打印统计结果
    
    版本: 1.0.0.20250120
    作者: 陈振玺
    """
    print("\n=== 列统计信息 ===")
    
    # 基本信息
    basic_info = ['总行数', '非空值数量', '空值数量', '唯一值数量', '数据类型']
    for key in basic_info:
        if key in stats:
            print(f"{key}: {stats[key]}")
    
    print("\n=== 数据分布 ===")
    
    # 数值型统计
    if stats.get('数据类型') == '数值型':
        numeric_keys = ['最小值', '最大值', '平均值', '中位数', '标准差', '25%分位数', '75%分位数']
        for key in numeric_keys:
            if key in stats:
                print(f"{key}: {stats[key]}")
    
    # 文本型统计
    elif stats.get('数据类型') == '文本型':
        text_keys = ['最常见值', '最常见值频次', '平均字符长度', '最短字符长度', '最长字符长度']
        for key in text_keys:
            if key in stats:
                print(f"{key}: {stats[key]}")
    
    # 频次分布
    if '前10个最常见值' in stats and stats['前10个最常见值']:
        print("\n=== 前10个最常见值 ===")
        for value, count in stats['前10个最常见值'].items():
            print(f"{value}: {count}")

def main():
    """
    主函数 - 命令行入口
    
    版本: 1.0.0.20250120
    作者: 陈振玺
    """
    parser = argparse.ArgumentParser(
        description='分析CSV/TSV文件中指定列的基本统计信息',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""示例:
  data-stats -i data.csv -c age
  data-stats -i data.tsv -c name -d "\t"
  data-stats -i data.txt -c score -d ","
        """
    )
    
    parser.add_argument('-i', '--input', required=True,
                       help='输入的CSV/TSV文件路径')
    parser.add_argument('-c', '--column', required=True,
                       help='要分析的列名')
    parser.add_argument('-d', '--delimiter', default=None,
                       help='分隔符（默认自动检测：CSV用逗号，TSV用制表符）')
    
    args = parser.parse_args()
    
    try:
        # 检查文件是否存在
        if not Path(args.input).exists():
            print(f"错误: 文件不存在 - {args.input}", file=sys.stderr)
            sys.exit(1)
        
        print(f"正在分析文件: {args.input}")
        print(f"分析列: {args.column}")
        
        # 执行分析
        stats = analyze_column_stats(args.input, args.column, args.delimiter)
        
        # 打印结果
        print_stats(stats)
        
        print("\n分析完成!")
        
    except Exception as e:
        print(f"错误: {e}", file=sys.stderr)
        sys.exit(1)

if __name__ == '__main__':
    main()